﻿using BuyWithoutLoseMoney.Core.Models;
using BuyWithoutLoseMoney.Core.Repositories;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Security.Claims;
using System.Threading.Tasks;

namespace BuyWithoutLose.Controllers
{
    [AllowAnonymous]
    public class LoginController : Controller
    {
        private readonly ILogger<LoginController> _logger;
        private readonly IRepository<User, int> _userRepostitory;


        public LoginController(ILogger<LoginController> logger, IRepository<User, int> userRepository)
        {
            _logger = logger;
            _userRepostitory = userRepository;

        }
        /// <summary>
        /// 登录
        /// </summary>
        /// <returns></returns>
        #region 登录

        public IActionResult Login()
        {
            var user = _userRepostitory.GetAll();
            ViewBag.User = user;
            return View();
        }
        [HttpPost]
        public async Task<IActionResult> Login(string name, string pwd)
        {

            var Manager = await _userRepostitory.FirstOrDefaultAsync(x => x.UserName == name);
            bool isSuccess = false;
            string msg = "用户名或密码不正确";
            if (Manager != null && Manager.UserPwd == pwd )
            {
                if (Manager.IsZhuXiao == true)//判断是非被注销
                {
                    isSuccess = false;
                    msg = "该用户已注销,请重新注册！！！";
                    return Json(new { isSuccess, msg });
                }
                var claims = new[] { new Claim(name, pwd,Manager.Id.ToString()) };
                var claimsIdentity = new ClaimsIdentity(claims,CookieAuthenticationDefaults.AuthenticationScheme);
                ClaimsPrincipal user = new ClaimsPrincipal(claimsIdentity);
                Task.Run(async () =>
                {
                   
                    //可以使用HttpContext.SignInAsync方法的重载来定义持久化cookie存储用户认证信息，例如下面的代码就定义了用户登录后60分钟内cookie都会保留在客户端计算机硬盘上，
                    //即便用户关闭了浏览器，60分钟内再次访问站点仍然是处于登录状态，除非调用Logout方法注销登录。
                    //注意其中的AllowRefresh属性，如果AllowRefresh为true，表示如果用户登录后在超过50%的ExpiresUtc时间间隔内又访问了站点，就延长用户的登录时间（其实就是延长cookie在客户端计算机硬盘上的保留时间），
                    //例如本例中我们下面设置了ExpiresUtc属性为60分钟后，那么当用户登录后在大于30分钟且小于60分钟内访问了站点，那么就将用户登录状态再延长到当前时间后的60分钟。但是用户在登录后的30分钟内访问站点是不会延长登录时间的，
                    //因为ASP.NET Core有个硬性要求，是用户在超过50%的ExpiresUtc时间间隔内又访问了站点，才延长用户的登录时间。
                    //如果AllowRefresh为false，表示用户登录后30分钟内不管有没有访问站点，只要60分钟到了，立马就处于非登录状态（不延长cookie在客户端计算机硬盘上的保留时间，60分钟到了客户端计算机就自动删除cookie）

                    await HttpContext.SignInAsync(//HttpContext.SignInAsync方法的重载来定义持久化cookie存储用户认证信息
                    CookieAuthenticationDefaults.AuthenticationScheme,//CookieAuthenticationDefaults.AuthenticationScheme身份验证方案名
                    user, new AuthenticationProperties()
                    {
                        IsPersistent = true,//是否持续保存
                        ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(60),//用户登录后60分钟内cookie都会保留在客户端计算机硬盘上
                        AllowRefresh = true//允许刷新
                    });
                     

                }).Wait();
                isSuccess = true;
                msg = "登录成功!";
            }
            return Json(new { isSuccess, msg });
        }
        #endregion

        /// <summary>
        /// 注册
        /// </summary>
        /// <returns></returns>
        #region 注册
        public IActionResult Register()
        {
            return View();
        }
        [HttpPost]
        public async Task<IActionResult> Register(User user)
        {
            user.CreateTime = DateTime.Now;
            if (ModelState.IsValid)
            {
                await _userRepostitory.InsertAsync(user);//添加用户信息
                return Json(new { isSuccess = true, msg = "添加成功，页面即将刷新！" });
            }
            return Json(new { isSuccess = false, msg = "添加失败，页面即将返回！" });
        }
        #endregion

        /// <summary>
        /// 退出登录
        /// </summary>
        /// <returns></returns>
        public IActionResult LoginOut()
        {
            Task.Run(async () =>
            {
                //注销登录的用户，相当于ASP.NET中的FormsAuthentication.SignOut  
                await HttpContext.SignOutAsync();
            }).Wait();

            return Redirect("/home/index");
        }
    }
}
